// 全局变量
let clientId = generateClientId();
let isAwaitingConfirmation = false;
let eventSource = null;

// 页面加载完成后执行
document.addEventListener('DOMContentLoaded', () => {
    // 绑定发送按钮事件
    document.getElementById('sendButton').addEventListener('click', sendMessage);
    
    // 绑定输入框回车事件
    document.getElementById('userInput').addEventListener('keypress', (e) => {
        if (e.key === 'Enter' && !e.shiftKey) {
            e.preventDefault();
            sendMessage();
        }
    });
    
    // 绑定订票选项按钮事件
    document.querySelectorAll('.option-button').forEach(button => {
        button.addEventListener('click', () => {
            const choice = button.getAttribute('data-choice');
            sendChoice(choice);
        });
    });
});

// 发送用户消息
async function sendMessage() {
    const userInput = document.getElementById('userInput');
    const message = userInput.value.trim();
    
    // 检查消息是否为空
    if (!message) return;
    
    // 如果正在等待确认，不允许发送新消息
    if (isAwaitingConfirmation) {
        alert('请先确认或取消当前订票');
        return;
    }
    
    // 显示用户消息
    addUserMessage(message);
    
    try {
        // 关闭之前的事件源（如果存在）
        if (eventSource) {
            eventSource.close();
        }
        
        // 创建新的事件源用于接收订票确认信息
        const url = `/api/start-booking?client_id=${encodeURIComponent(clientId)}&query=${encodeURIComponent(message)}`;
        
        // 发送消息到服务器
        const response = await fetch('/api/start-booking', {
            method: 'POST',
            headers: {
                'Content-Type': 'application/json',
            },
            body: JSON.stringify({
                query: message,
                client_id: clientId
            }),
        });
        
        // 检查响应类型
        const contentType = response.headers.get('content-type');
        
        if (contentType && contentType.includes('text/event-stream')) {
            // 处理流式响应
            const reader = response.body.getReader();
            const decoder = new TextDecoder();
            let buffer = '';
            
            // 读取流
            while (true) {
                const { done, value } = await reader.read();
                if (done) break;
                
                buffer += decoder.decode(value, { stream: true });
                
                // 处理完整的SSE消息
                const lines = buffer.split('\n\n');
                buffer = lines.pop() || '';
                
                for (const line of lines) {
                    if (line.startsWith('data: ')) {
                        try {
                            const data = JSON.parse(line.slice(6));
                            handleStreamResponse(data);
                            
                            // 如果收到确认信息，显示选项按钮
                            if (data.content && data.content.includes('订票确认')) {
                                isAwaitingConfirmation = true;
                                document.getElementById('bookingOptions').style.display = 'flex';
                            }
                        } catch (e) {
                            console.error('解析SSE数据错误:', e);
                        }
                    }
                }
            }
        } else {
            // 处理JSON响应
            const data = await response.json();
            
            if (data.status === 'success') {
                // 更新客户端ID（如果服务器返回了新的）
                if (data.client_id) {
                    clientId = data.client_id;
                }
                
                // 标记为等待确认状态
                isAwaitingConfirmation = true;
            } else {
                console.error('启动订票流程失败:', data);
                addSystemMessage('启动订票流程失败，请重试');
            }
        }
    } catch (error) {
        console.error('发送消息错误:', error);
        addSystemMessage('发送消息时出错，请重试');
    }
    
    // 清空输入框
    userInput.value = '';
}

// 发送用户选择
async function sendChoice(choice) {
    // 隐藏选项按钮
    document.getElementById('bookingOptions').style.display = 'none';
    
    // 显示用户选择
    const choiceText = choice === 'confirm' ? '确认订票' : '取消订票';
    addUserMessage(choiceText);
    
    try {
        // 关闭之前的事件源（如果存在）
        if (eventSource) {
            eventSource.close();
        }
        
        // 创建新的事件源
        const url = `/api/process-choice?client_id=${encodeURIComponent(clientId)}&choice=${encodeURIComponent(choice)}`;
        eventSource = new EventSource(url);
        
        // 处理事件
        eventSource.onmessage = function(event) {
            const data = JSON.parse(event.data);
            handleStreamResponse(data);
        };
        
        eventSource.onerror = function(error) {
            console.error('事件流错误:', error);
            eventSource.close();
            addSystemMessage('连接中断，请重试');
        };
    } catch (error) {
        console.error('发送选择错误:', error);
        addSystemMessage('发送选择时出错，请重试');
    }
    
    // 重置确认状态
    isAwaitingConfirmation = false;
}

// 处理流式响应
function handleStreamResponse(data) {
    const chatMessages = document.getElementById('chatMessages');
    const bookingOptions = document.getElementById('bookingOptions');
    
    // 根据消息类型处理
    if (data.type === 'content') {
        // 检查是否已经有当前助手消息元素
        let currentAssistantMessage = chatMessages.querySelector('.assistant-message.current');
        
        // 如果没有，创建一个新的
        if (!currentAssistantMessage) {
            currentAssistantMessage = document.createElement('div');
            currentAssistantMessage.className = 'assistant-message current';
            chatMessages.appendChild(currentAssistantMessage);
        }
        
        // 添加内容
        if (data.content) {
            currentAssistantMessage.innerHTML += data.content;
            
            // 检查消息内容是否包含确认信息
            if (data.content.includes('订票确认')) {
                isAwaitingConfirmation = true;
                bookingOptions.style.display = 'flex';
            }
        }
        
        // 如果消息完成
        if (data.done) {
            currentAssistantMessage.classList.remove('current');
            
            // 关闭事件源
            if (eventSource) {
                eventSource.close();
                eventSource = null;
            }
        }
        
        // 滚动到底部
        chatMessages.scrollTop = chatMessages.scrollHeight;
    } else if (data.type === 'error') {
        // 显示错误消息
        const errorMessage = document.createElement('div');
        errorMessage.className = 'system-message error';
        errorMessage.textContent = data.content || '发生错误，请重试';
        chatMessages.appendChild(errorMessage);
        chatMessages.scrollTop = chatMessages.scrollHeight;
        
        // 关闭事件源
        if (eventSource) {
            eventSource.close();
            eventSource = null;
        }
    }
}

// 添加用户消息到聊天界面
function addUserMessage(message) {
    const chatMessages = document.getElementById('chatMessages');
    const userMessage = document.createElement('div');
    userMessage.className = 'user-message';
    userMessage.textContent = message;
    chatMessages.appendChild(userMessage);
    chatMessages.scrollTop = chatMessages.scrollHeight;
}

// 添加系统消息到聊天界面
function addSystemMessage(message) {
    const chatMessages = document.getElementById('chatMessages');
    const systemMessage = document.createElement('div');
    systemMessage.className = 'system-message';
    systemMessage.textContent = message;
    chatMessages.appendChild(systemMessage);
    chatMessages.scrollTop = chatMessages.scrollHeight;
}

// 生成客户端ID
function generateClientId() {
    return 'client_' + Math.random().toString(36).substr(2, 9);
}